/**
 * Copyright 2013 Ognyan Bankov
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tpv.app.volley.demo.util;

import android.text.TextUtils;

import com.android.volley.AuthFailureError;
import com.android.volley.VolleyLog;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

import org.w3c.dom.Text;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

public class GsonRequest<T> extends Request<T>
{
    private final Gson mGson;
    private final Class<T> mClazz;
    private final Listener<T> mListener;
    private final String mRequestBody;
    /**
     * Default charset for JSON request.
     */
    private static final String PROTOCOL_CHARSET = "utf-8";
    
    public GsonRequest(int method, String url, String mRequestBody, Class<T> clazz, GsonVolleyListener<T> listener)
    {
        super(method, url, listener);
        this.mClazz = clazz;
        this.mListener = listener;
        this.mRequestBody = mRequestBody;
        mGson = new Gson();
    }
    
    public GsonRequest(String url, String mRequestBody, Class<T> clazz, GsonVolleyListener<T> listener, Gson gson)
    {
        super(Method.POST, url, listener);
        this.mClazz = clazz;
        this.mListener = listener;
        this.mRequestBody = mRequestBody;
        mGson = gson;
    }
    
    @Override
    protected void deliverResponse(T response)
    {
        mListener.onResponse(response);
    }
    
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response)
    {
        try
        {
            String json = new String(response.data, "utf-8");
            return Response.success(mGson.fromJson(json, mClazz), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e)
        {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e)
        {
            return Response.error(new ParseError(e));
        }
    }
    
    @Override
    protected Map<String, String> getParams() throws AuthFailureError
    {
        if (!TextUtils.isEmpty(mRequestBody))
        {
            Map<String, String> map=new HashMap<>();
            map.put("voteBean",mRequestBody);
            return map;
        }
        return super.getParams();
    }
    
    
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError
    {
        /**
         * 请求头参数
         */
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("device", "android");
        headers.put("Accept", "application/json");
        headers.put("Content-Type", "application/json; charset=UTF-8");
        return headers;
    }
}